import cv2
from pyzbar import pyzbar

def detect_barcodes(frame):
    # 转换为灰度图（提高识别效率）
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # 识别条形码
    barcodes = pyzbar.decode(gray)
    
    # 处理识别到的条形码
    for barcode in barcodes:
        # 获取条形码的边界框坐标
        (x, y, w, h) = barcode.rect
        # 绘制边界框
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        
        # 提取条形码数据（转换为字符串）
        barcode_data = barcode.data.decode("utf-8")
        barcode_type = barcode.type
        
        # 在图像上显示识别结果
        text = f"{barcode_data} ({barcode_type})"
        cv2.putText(frame, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
        
        # 打印识别结果（快递单号通常在这里）
        print(f"识别到: {barcode_data} (类型: {barcode_type})")
    
    return frame

def main():
    # 打开摄像头（0表示默认摄像头）
    cap = cv2.VideoCapture(0)
    
    while True:
        # 读取一帧视频
        ret, frame = cap.read()
        if not ret:
            break
        
        # 识别并处理条形码
        frame = detect_barcodes(frame)
        
        # 显示处理后的帧
        cv2.imshow("Barcode Scanner", frame)
        
        # 按 'q' 退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # 释放资源
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()
